約 998,207 件
https://w.atwiki.jp/railsimpiwiki/pages/47.html
利用規約等は各掲載先で必ずご確認ください。 貨物上屋(pasuko) 跨線橋ver5(pasuko) ホーム照明(pasuko) 貨物上屋(pasuko) PI名 貨物上屋 作者 pasuko PI画像 公開先URL プラグイン(メタセコイア素材)置き場その2(by pasuko) 最終更新日 2016年01月01日 利用規約 こちらに掲載 その他 跨線橋ver5(pasuko) PI名 跨線橋ver5 作者 pasuko PI画像 公開先URL プラグイン(メタセコイア素材)置き場(by pasuko) 最終更新日 2013年11月16日 利用規約 こちらに掲載 その他 ホーム照明(pasuko) PI名 ホーム照明 作者 pasuko PI画像 公開先URL プラグイン(メタセコイア素材)置き場その2(by pasuko) 最終更新日 2015年06月07日 利用規約 こちらに掲載 その他
https://w.atwiki.jp/3dcustom/pages/51.html
0から始める3Dカスタム少女MOD制作 【注意】 ある程度のPCの知識があることが前提での解説になります。 最低限PCの使い方(windows updateでのソフトのインストールや必要なソフトのインストールと設定)、 アップローダでのダウンロードやファイルの圧縮・解凍、「拡張子」という言葉の意味くらいは きちんと理解してからMODの作成を行いましょう。 (これらの知識を応用しての作業になるためです) ※以下は個人によって書かれているものをベースに追記・編集して作られています。 【はじめに】 自分が初めてMODを作るとき ファイルを解凍しても何がなにやら分からず、3Dモデリングの知識すらもなく ただひたすらに混迷を極め、時間と精神力を徒に摩耗していったことを覚えています 自分と同じような、初心者の人たちのMOD制作の手助けになればと思い 自分の試行錯誤の範囲で分かったことをまとめました この項目に書かれていることを真似すれば恐らくあまり迷うことなくMODを制作できると思います ですが誤った情報、適当ではない手法なども多分に書かれていると思います わかりやすさを重視しているため非効率的な段階を踏んでいる場所も少なくありません このページは記されている手順の通りに進めるためのものとしてではなく MODの中身を理解する手段の一つであるということを理解し読み進めて貰えるとうれしいです 全ては素人の試行錯誤の結果です。最適化されていない箇所もあれば妙な手順も有ると思います もし誤っている箇所を見つけた場合、注記を入れてくださるとうれしいです ※くどいほどの解説付きの「一例」です 分かり安い「フローチャート」と「FAQ」は後ほど作成の予定です・・・ 具体的な衣装MOD作成は【konozamaの書】で詳しく説明していますが、 初めての方はまずはこちらから始めると良いでしょう。 目次 前準備 必要なソフトなどに付いて メタセコイアで3Dモデルを作る 一からメタセコイアを使ってモデルを作る方法です 3Dカスタム少女との直接的な関係はあまりありません メタセコに触るのが全くの初めて、という方以外読む必要性はないと思います テクスチャ テクスチャの作り方。UVマッピングについての簡単な説明などです あまり説明らしい説明になっていない気がします ファイルの内部構造とMOD作成の開始 ここからいよいよMOD制作の作業です 3Dモデリングとテクスチャについては大丈夫な人はここからお読みください シェーダー設定とXML シェーダー設定ファイルとXMLファイルについてです TSOにまとめる ファイル名や階層など mqo→tsoへと梱包していく方法です TAHにまとめる TSOファイルからTAHを完成させる方法など 終章です
https://w.atwiki.jp/railsimnewwiki/pages/283.html
プラグイン製作についていろいろと便利なTipsや mqoファイル、テクスチャ素材などを置く予定です。 Tipsや資料の執筆募集中(´・ω・`) PI資料庫 プラグインづくりに便利なTips レイアウトづくりに便利なTips mqo素材 共有テクスチャ(common_rnwシリーズ)
https://w.atwiki.jp/urakata5/pages/11.html
MQOでのモデル作成方法について述べます。 imageプラグインエラー ご指定のURLはサポートしていません。png, jpg, gif などの画像URLを指定してください。 モデリング モデル製作に関して、基本的には制限はありません。 しかし、ポリゴン数が多すぎるとコンバート時に長い時間がかかったり ゲーム時の描画負荷が増してしまいます。 目安として△8000ポリ以下で作るのが良いでしょう。 指先はまっすぐに伸ばす形で作ってください。 親指に関しては元々動かすためのボーンが入っていないので、動かせません。 あらかじめ若干曲がった形でつくると自然に見えるでしょう。 テクスチャ imageプラグインエラー ご指定のURLはサポートしていません。png, jpg, gif などの画像URLを指定してください。 テクスチャは上の画像のようにローカルのディレクトリを参照する用にしてください。 テクスチャのディレクトリが[C \Documents and Settings\user\デスクトップ\gazou.png] 等と言った様にフルパスで指定されると不具合の原因となります。 テクスチャに関しては解像度を2のべき乗で行ってください。 その以外の解像度でテクスチャを作成するとぼやけてしまいます。 なお、テクスチャの存在しないポリゴンやマテリアルは描画されませんので 単色のオブジェクトであってもテクスチャを設定してください。 例 ○:128*128,256*256,512*512,等の解像度 ×:100*100,777*1000等の解像度 アルファ情報 アルファ情報、抜き色について 髪の毛の毛先の表現や半透明のオブジェクト等の表現は透過情報を含むテクスチャによって 行います。 24bitpng及びtgaの透過情報がそのまま反映されます。 透明情報専用のテクスチャを用意する必要はありません。 透過情報についてはメタセコイア上で確認できますので、メタセコイアでテクスチャの アルファ抜きが綺麗に出てるのをよく確認してください。 気をつける事 マテリアル名とオブジェクト名には日本語を利用しないで下さい。 2バイト文字はエラーの原因となります。 両面ポリゴンと重なったポリゴンがあるとコンバート時にエラーの原因となります。 そのようなポリゴンが作られないようにモデル作成をしてください。
https://w.atwiki.jp/railsimpiwiki/pages/37.html
利用規約等は各掲載先で必ずご確認ください。 農業用倉庫Ver2(pasuko) 基地局(紫霧@) 保線事務所ver2(pasuko) カントリーエレベーター(pasuko) 農業用倉庫Ver2(pasuko) PI名 pa農業用倉庫Ver2 作者 pasuko PI画像 公開先URL プラグイン(メタセコイア素材)置き場その2(by pasuko) 最終更新日 2015年4月14日 利用規約 公開先ページ上部に掲載 その他 基地局(紫霧@) PI名 基地局 作者 紫霧@ PI画像 公開先URL OneDrive 最終更新日 2014年5月31日 利用規約 利用規約 その他 保線事務所ver2(pasuko) PI名 pa保線事務所ver2 作者 pasuko PI画像 公開先URL プラグイン(メタセコイア素材)置き場その2(by pasuko) 最終更新日 2015年11月16日 利用規約 公開先ページ上部に掲載 その他 カントリーエレベーター(pasuko) PI名 paカントリーエレベーター 作者 pasuko PI画像 公開先URL プラグイン(メタセコイア素材)置き場(by pasuko) 最終更新日 2015年12月06日 利用規約 こちらに掲載 その他
https://w.atwiki.jp/ishitubute/pages/1104.html
『ケロ口軍曹◆K66/G13mqo』はBARギコっぽい一般の住民である。 トリップのバックアップ(メモ)を無くし「K66/G13mqo」に変更。 魚釣り、自動車、自作PC大好き。 音声配信を引退し、現在は動画と音楽配信しかやらない。
https://w.atwiki.jp/you-matu/pages/12.html
ソフト 3D 音楽 コメント XP対応 3D 3dsmax maya ライトウェーブ AEイマージ ソフトイマージ Modtool7.5 メタセイコア DLhttp //www.metaseq.net/metaseq/download.html KL爺メタセコイア指南書 http //ktg.xii.jp/mqo/ メタセコイアまとめ http //gaha2.blog52.fc2.com/blog-entry-173.html メタセコイア動画 http //www.nicovideo.jp/search/%E3%83%A1%E3%82%BF%E3%82%BB%E3%82%B3%E3%82%A4%E3%82%A2 CB Model 目次へ戻る 音楽 午後のこ~だ for Windows Ver3.13 目次へ戻る 目次へ戻る コメント コメント すべてのコメントを見る ISBNで書籍を検索し情報を一括登録できる蔵書管理ソフト「私本管理Plus」 フォルダ構造作成ソフト「StructureT-Maker」 CPU温度を測定するフリーのソフトウェア 1. HWMonitor - インストール不要で、使い方も簡単!!ソフトを起動させるだけで、CPUやGPU、システムやHDDの温度を測定 http //www.cpuid.com/hwmonitor.php 2. Core Temp ダウンロード - AMD (Athlon64, Athlon64 X2, Athlon64 FX, Turion64, Turion64 X, Sempron, Opteron など) Intel (Core Solo, Core Duo, Core 2 Duo, Quad Core, Pentium 1000, Xeon などの) プロセッサに対応 3. EVEREST Home Edition ダウンロード - CPU温度を含め、PCのシステム情報をチェック http //www.altech-ads.com/product/10000755.html 4. SpeedFan ダウンロード - ファン回転数の調整、CPU温度やコア電圧、CPU使用率やメモリの情報などを表示 http //www.altech-ads.com/product/10001072.htm 5. Coew 2 Duoの温度について http //oshiete1.goo.ne.jp/qa2980398.html?ans_count_asc=20 6. Core 2 Duo E6600 電圧調整での温度測定 - コア電圧の調整で温度変化が起こるかの実験結果 http //www6.plala.or.jp/vaiomind/core.html 7. CPU温度+静穏対策 - CPUクーラー選び http //www.clevery.co.jp/ PCメンテナンスは「Advanced System Care」 不要なファイルやレジストリこれを解消 http //www.oshiete-kun.net/archives/2009/06/0907-68-2.html http //www.softpedia.com/progDownload/Advanced-WindowsCare-Download-23169.html WinDeskWideとは、Windowsで動作する仮想画面ソフトウェアです http //bluecard.no-ip.com/freeware/WinDeskWide/#DOWNLOAD GetHTML ホームページをまるごと Get して、オフラインで閲覧 コマンドライン版 http //www.vector.co.jp/soft/win95/net/se077066.html メタセコで作った3Dを動かすには、 RokDeBone2 モデリング→六角大王3D アニメーション→LightWave3D 編集→AfterEffects UPロダ ニコニコ動画アップローダー http //muvluv-survivor.game-server.cc/cgi-bin/nico-up/upload.html UPロダへのリンク http //www.geocities.jp/debu0510/personal/uplinker.html 音響がかりさん2は複数同時再生可能なプレイヤーです。 ポン出し機能に使えます http //masaota56.x0.to/soft/onkyo2/ 各音源毎に、フェードイン、フェードアウト、 再生遅延時間、再生範囲、音量を指定できます。 また、各音源ファイルをドラッグアンドドロップで配置することができます。 えこでこツール http //sourceforge.jp/projects/ecodecotool/wiki/FrontPage ほとんどのサウンドファイル・ムービーファイルから wav、aac、mp3、oggに変換することができるツールです。 avi、flv、mkv、mp4、mpg、ogmファイルから 音声部分をそのまま抜き出す事もできます。 ソフトは Softimage|XSI 7.01使用 目次へ戻る
https://w.atwiki.jp/opengl/pages/64.html
今回は取りあえず、頂点配列で表示してみます。 .MQO の頂点データはインデックスになっていますが UV座標のデータは インデックスにはなっていないので glDrawElements を使うとテクスチャが めちゃくちゃになってしまいます。 仕方が無いので glDrawArrays 用に配列データを作成し直して描画 する事にしました。 今回は取りあえず表示するだけという事で法線やライトなどは省略し、VBOにもしていません。 それとテクスチャに使える画像形式はPNGのみです。今の所。 今後はワイヤーフレーム表示とかにも挑戦してみます。 PNG.h #include lodepng.h //テクスチャクラス class TEXTURE{ protected LodePNG_Decoder decoder;//デコーダ unsigned char* buffer;//バッファ size_t buffersize, imagesize;//サイズ public TEXTURE(); TEXTURE(const char* FileName);//コンストラクタ void LOAD_PNG(const char* FileName);//PNG読み込み unsigned char* image;//イメージポインタ unsigned int Width,Height;//画像サイズ }; TEXTURE TEXTURE(){ } TEXTURE TEXTURE(const char* FileName){ LOAD_PNG(FileName); } void TEXTURE LOAD_PNG(const char* FileName){ LodePNG_Decoder_init( decoder); //ロード LodePNG_loadFile( buffer, buffersize, FileName); //デコード LodePNG_decode( decoder, image, imagesize, buffer, buffersize); //幅,高さ Width = decoder.infoPng.width;Height = decoder.infoPng.height; } MQO.h #include string #include vector #include PNG.h using namespace std; //3つのベクトル struct Vector3f{ float x; float y; float z; }; //4つのベクトル struct Vector4f{ float x; float y; float z; float w; }; //4つの反射 struct Reflection4{ float diffuse; float ambient; float emission; float specular; }; //4つのカラー struct Color4{ float r; float g; float b; float a; }; //UV座標 struct UV{ float u;//u値 float v;//v値 }; //面情報構造体 struct POLYGON{ bool Polygon;//3角か4角か true=4;false=3; GLuint Index[4];//インデックス int MaterialID;//マテリアルNo. UV uv[4];//UV情報 }; //ポリゴンデータ struct GROUP{ bool Texture_Use;//テクスチャを使うか vector Vector3f TriVer;//3角頂点データ vector Vector3f QuadVer;//4角頂点データ vector float TriUV;//3角UV vector float QuadUV;//4角UV }gro; //オブジェクト構造体 struct OBJECT{ bool View;//表示するか string Name;//オブジェクト名 vector GROUP Group;//マテリアル毎のグループ }obj; //マテリアル構造体 struct MATERIAL{ int MaterialID;//ID string MaterialName;//マテリアル名 Color4 Color;//カラー Reflection4 ReflectionColor;//反射 float Power;//shiness string TextureName;//テクスチャ名 }mtl; //モデルクラス class MODEL{ protected FILE* fp;//ファイルポインタ char buf[255];//読み込み用バッファ string str; TEXTURE* tex2; GLuint texture2; //読み込み用 vector Vector3f Vertex;//頂点データ POLYGON Poly;//面情報 void Vertex_Set();//頂点情報セット void Material_Set();//マテリアル情報セット void Face_Set();//面情報セット string Split(string* str,char str1,char str2);//文字列分離 public MODEL(); MODEL(char* FileName);//コンストラクタ vector MATERIAL Material;//マテリアル vector OBJECT Object;//オブジェクトデータ vector TEXTURE* tex;//テクスチャデータ vector GLuint texture;//テクスチャID bool MQO_Load(char* FileName);//ロード void DRAW();//描画 }; MODEL MODEL(){ } MODEL MODEL(char* FileName){ MQO_Load(FileName); } //文字列分離 string MODEL Split(string *str, char str1, char str2){ string size_type start = str- find(str1); string size_type end = str- rfind(str2); return str- substr(start+1,end-start-1); } //モデル描画 void MODEL DRAW(){ glEnableClientState(GL_VERTEX_ARRAY); for(int i=0;i (signed)Object.size();i++){ if(Object[i].View){ for(int j=0;j (signed)Object[i].Group.size();j++){ GLfloat material[] = { Material[j].Color.r, Material[j].Color.g, Material[j].Color.b, Material[j].Color.a }; glMaterialfv(GL_FRONT, GL_DIFFUSE, material); if(Object[i].Group[j].Texture_Use){ glEnable(GL_TEXTURE_2D); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindTexture(GL_TEXTURE_2D, texture[j]); }else{ glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } if(0 Object[i].Group[j].TriUV.size())glTexCoordPointer(2,GL_FLOAT,0, Object[i].Group[j].TriUV[0]); if(0 Object[i].Group[j].TriVer.size()){ glVertexPointer(3,GL_FLOAT,0, Object[i].Group[j].TriVer[0]); glDrawArrays(GL_TRIANGLES,0,Object[i].Group[j].TriVer.size()); } if(0 Object[i].Group[j].QuadUV.size())glTexCoordPointer(2,GL_FLOAT,0, Object[i].Group[j].QuadUV[0]); if(0 (signed)Object[i].Group[j].QuadVer.size()){ glVertexPointer(3,GL_FLOAT,0, Object[i].Group[j].QuadVer[0]); glDrawArrays(GL_QUADS,0,Object[i].Group[j].QuadVer.size()); } }} } glDisable(GL_TEXTURE_2D); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } //マテリアルセット void MODEL Material_Set(){ int mat; fscanf_s(fp, %d , mat);//マテリアル数 fscanf_s(fp, %s , buf,255);// { を読み飛ばす for(int i=0;i mat;i++){ Material.push_back(mtl); fscanf_s(fp, %s , buf,255);//マテリアル名格納 str=buf; Material[Material.size()-1].MaterialName=Split( str, \ , \ );// を除去 fgets(buf,255,fp); char* buf2; if((buf2 = strstr(buf, col( )) != NULL ){//マテリアルカラー格納 sscanf_s(buf2, col(%f %f %f %f) , Material[Material.size()-1].Color.r, Material[Material.size()-1].Color.g, Material[Material.size()-1].Color.b, Material[Material.size()-1].Color.a); } if((buf2 = strstr(buf, dif( )) != NULL ){//ディフューズ格納 sscanf_s(buf2, dif(%f) , Material[Material.size()-1].ReflectionColor.diffuse); } if((buf2 = strstr(buf, amb( )) != NULL ){//アンビエント格納 sscanf_s(buf2, amb(%f) , Material[Material.size()-1].ReflectionColor.ambient); } if((buf2 = strstr(buf, emi( )) != NULL ){//エミッション格納 sscanf_s(buf2, emi(%f) , Material[Material.size()-1].ReflectionColor.emission); } if((buf2 = strstr(buf, spc( )) != NULL ){//スペキュラー格納 sscanf_s(buf2, spc(%f) , Material[Material.size()-1].ReflectionColor.specular); } if((buf2 = strstr(buf, power( )) != NULL ){//shiness格納 sscanf_s(buf2, power(%f) , Material[Material.size()-1].Power); } if((buf2 = strstr(buf, tex( )) != NULL ){//テクスチャ名格納 sscanf_s(buf2, tex(%[^)]) ,buf,255); str=buf; Material[Material.size()-1].TextureName=Split( str, \ , \ );// を除去 tex.push_back(tex2); tex[Material.size()-1] = new TEXTURE(Material[Material.size()-1].TextureName.c_str()); texture.push_back(texture2); glGenTextures(1, (GLuint *) texture[Material.size()-1]); glBindTexture(GL_TEXTURE_2D, texture[Material.size()-1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glEnable(GL_TEXTURE_2D); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,tex[Material.size()-1]- Width, tex[Material.size()-1]- Height, 0,GL_RGBA, GL_UNSIGNED_BYTE, tex[Material.size()-1]- image); glDisable(GL_TEXTURE_2D); } } } //頂点情報セット void MODEL Vertex_Set(){ int Vertex_Max; Vector3f v; fscanf_s(fp, %d , Vertex_Max);//頂点数取得 fscanf_s(fp, %s , buf,255);// { を読み飛ばす for(int i=0;i Vertex_Max;i++){ fscanf_s(fp, %f %f %f , v.x, v.y, v.z); Vertex.push_back(v); } fscanf_s(fp, %s , buf,255);// } を読み飛ばす fscanf_s(fp, %s , buf,255); } //面情報セット void MODEL Face_Set(){ int Face_Max; int Face; Vector3f v; char* buf2; fscanf_s(fp, %d , Face_Max);//面数取得 fscanf_s(fp, %s , buf,255);// { を読み飛ばす for(int i=0;i Face_Max;i++){ fscanf_s(fp, %d , Face); if(Face==3){//3角形 Poly.Polygon=false; fgets(buf,255,fp); if((buf2 = strstr(buf, V( )) != NULL ){ sscanf_s(buf2, V(%d %d %d) , Poly.Index[0], Poly.Index[1], Poly.Index[2]); } if((buf2 = strstr(buf, M( )) != NULL ){ sscanf_s(buf2, M(%d) , Poly.MaterialID); } if((buf2 = strstr(buf, UV( )) != NULL ){ sscanf_s(buf2, UV(%f %f %f %f %f %f) , Poly.uv[0].u, Poly.uv[0].v, Poly.uv[1].u, Poly.uv[1].v, Poly.uv[2].u, Poly.uv[2].v); } for(int i=0;i 3;i++){ v=Vertex[Poly.Index[i]]; Object[Object.size()-1].Group[Poly.MaterialID].TriVer.push_back(v); Object[Object.size()-1].Group[Poly.MaterialID].TriUV.push_back(Poly.uv[i].u); Object[Object.size()-1].Group[Poly.MaterialID].TriUV.push_back(Poly.uv[i].v); } } if(Face==4){//4角形 Poly.Polygon=true; fgets(buf,255,fp); if((buf2 = strstr(buf, V( )) != NULL ){ sscanf_s(buf2, V(%d %d %d %d) , Poly.Index[0], Poly.Index[1], Poly.Index[2], Poly.Index[3]); } if((buf2 = strstr(buf, M( )) != NULL ){ sscanf_s(buf2, M(%d) , Poly.MaterialID); } if((buf2 = strstr(buf, UV( )) != NULL ){ sscanf_s(buf2, UV(%f %f %f %f %f %f %f %f) , Poly.uv[0].u, Poly.uv[0].v, Poly.uv[1].u, Poly.uv[1].v, Poly.uv[2].u, Poly.uv[2].v, Poly.uv[3].u, Poly.uv[3].v); } for(int i=0;i 4;i++){ v=Vertex[Poly.Index[i]]; Object[Object.size()-1].Group[Poly.MaterialID].QuadVer.push_back(v); Object[Object.size()-1].Group[Poly.MaterialID].QuadUV.push_back(Poly.uv[i].u); Object[Object.size()-1].Group[Poly.MaterialID].QuadUV.push_back(Poly.uv[i].v); } } } Vertex.clear(); fscanf_s(fp, %s , buf,255);// } を読み飛ばす fscanf_s(fp, %s , buf,255); } //メタセコイアファイル読み込み bool MODEL MQO_Load(char* FileName){ int visible; if(fopen_s( fp,FileName, r )!=0){return false;} while (!feof(fp)) { fscanf_s(fp, %s , buf,255); if (!strcmp(buf, Material )){Material_Set();} if (!strcmp(buf, Object )){ Object.push_back(obj); for(int i=0;i (signed)Material.size();i++){ Object[Object.size()-1].Group.push_back(gro); if(Material[i].TextureName.length()==0){ Object[Object.size()-1].Group[i].Texture_Use=false; }else{ Object[Object.size()-1].Group[i].Texture_Use=true; } } fscanf_s(fp, %s , buf,255); Object[Object.size()-1].Name=buf; while (!feof(fp)) { fscanf_s(fp, %s , buf,255); if (!strcmp(buf, visible )){ fscanf_s(fp, %d , visible); if(visible==0){Object[Object.size()-1].View=false;}else{Object[Object.size()-1].View=true;} } if (!strcmp(buf, vertex )){Vertex_Set();} if (!strcmp(buf, face )){Face_Set();} if (!strcmp(buf, } ))break; } } } fclose(fp); return true; } main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include GL/freeglut/freeglut.h #include MQO.h #define WIDTH 320 #define HEIGHT 240 float angle=0.0f; MODEL* model; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0,0,WIDTH,HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glRotatef(angle,1.0f,0.0f,0.0f);//回転 glRotatef(angle,0.0f,1.0f,0.0f);//回転 model- DRAW(); glutSwapBuffers(); } void idle(void) { angle+=2.0f; Sleep(1); glutPostRedisplay(); } void Init(){ glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); model = new MODEL( sample.mqo ); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( MQOローダ ); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/opengl/pages/65.html
ワイヤーフレーム表示です。 最初、 glDrawArrays を使って描画したら遅くて実用的ではありませんでした。 そこで色々、思考錯誤して glMultiDrawArrays を使ったら、割りとそれなりの 速度で描画できるようになったので公開します。 PNG.h #include lodepng.h //テクスチャクラス class TEXTURE{ protected LodePNG_Decoder decoder;//デコーダ unsigned char* buffer;//バッファ size_t buffersize, imagesize;//サイズ public TEXTURE(); TEXTURE(const char* FileName);//コンストラクタ void LOAD_PNG(const char* FileName);//PNG読み込み unsigned char* image;//イメージポインタ unsigned int Width,Height;//画像サイズ }; TEXTURE TEXTURE(){ } TEXTURE TEXTURE(const char* FileName){ LOAD_PNG(FileName); } void TEXTURE LOAD_PNG(const char* FileName){ LodePNG_Decoder_init( decoder); //ロード LodePNG_loadFile( buffer, buffersize, FileName); //デコード LodePNG_decode( decoder, image, imagesize, buffer, buffersize); //幅,高さ Width = decoder.infoPng.width;Height = decoder.infoPng.height; } MQO_wire.h #include string #include vector #include PNG.h using namespace std; //3つのベクトル struct Vector3f{ float x; float y; float z; }; //4つのベクトル struct Vector4f{ float x; float y; float z; float w; }; //4つの反射 struct Reflection4{ float diffuse; float ambient; float emission; float specular; }; //4つのカラー struct Color4{ float r; float g; float b; float a; }; //UV座標 struct UV{ float u;//u値 float v;//v値 }; //面情報構造体 struct POLYGON{ bool Polygon;//3角か4角か true=4;false=3; GLuint Index[4];//インデックス int MaterialID;//マテリアルNo. UV uv[4];//UV情報 }; //ポリゴンデータ struct GROUP{ bool Texture_Use;//テクスチャを使うか vector Vector3f TriVer;//3角頂点データ vector Vector3f QuadVer;//4角頂点データ vector float TriUV;//3角UV vector float QuadUV;//4角UV //ワイヤーフレーム用 vector GLint TriWireID; vector GLsizei TriPoly; vector GLint QuadWireID; vector GLsizei QuadPoly; }gro; //オブジェクト構造体 struct OBJECT{ bool View;//表示するか string Name;//オブジェクト名 vector GROUP Group;//マテリアル毎のグループ }obj; //マテリアル構造体 struct MATERIAL{ int MaterialID;//ID string MaterialName;//マテリアル名 Color4 Color;//カラー Reflection4 ReflectionColor;//反射 float Power;//shiness string TextureName;//テクスチャ名 }mtl; //モデルクラス class MODEL{ protected FILE* fp;//ファイルポインタ char buf[255];//読み込み用バッファ string str; TEXTURE* tex2; GLuint texture2; //読み込み用 vector Vector3f Vertex;//頂点データ POLYGON Poly;//面情報 void Vertex_Set();//頂点情報セット void Material_Set();//マテリアル情報セット void Face_Set();//面情報セット string Split(string* str,char str1,char str2);//文字列分離 void WIRE_SET();//ワイヤーフレーム情報セット public MODEL(); MODEL(char* FileName);//コンストラクタ vector MATERIAL Material;//マテリアル vector OBJECT Object;//オブジェクトデータ vector TEXTURE* tex;//テクスチャデータ vector GLuint texture;//テクスチャID bool MQO_Load(char* FileName);//ロード void DRAW();//描画 void WIRE_FRAME_DRAW();//ワイヤーフレーム描画 }; MODEL MODEL(){ } MODEL MODEL(char* FileName){ MQO_Load(FileName); } //文字列分離 string MODEL Split(string *str, char str1, char str2){ string size_type start = str- find(str1); string size_type end = str- rfind(str2); return str- substr(start+1,end-start-1); } //ワイヤーフレーム用情報セット void MODEL WIRE_SET(){ for(int i=0;i (signed)Object.size();i++){ for(int j=0;j (signed)Object[i].Group.size();j++){ if(0 Object[i].Group[j].TriVer.size()){ for(int k=0;k (signed)Object[i].Group[j].TriVer.size()/3;k++){ Object[i].Group[j].TriWireID.push_back(k*3); Object[i].Group[j].TriPoly.push_back(3); } } if(0 (signed)Object[i].Group[j].QuadVer.size()){ for(int k=0;k (signed)Object[i].Group[j].QuadVer.size()/4;k++){ Object[i].Group[j].QuadWireID.push_back(k*4); Object[i].Group[j].QuadPoly.push_back(4); } } } } } //ワイヤーフレーム描画 void MODEL WIRE_FRAME_DRAW(){ glEnableClientState(GL_VERTEX_ARRAY); for(int i=0;i (signed)Object.size();i++){ if(Object[i].View){ for(int j=0;j (signed)Object[i].Group.size();j++){ if(0 Object[i].Group[j].TriVer.size()){ glVertexPointer(3,GL_FLOAT,sizeof(float)*3, Object[i].Group[j].TriVer[0]); glMultiDrawArrays(GL_LINE_LOOP, Object[i].Group[j].TriWireID[0], Object[i].Group[j].TriPoly[0],Object[i].Group[j].TriVer.size()/3); } if(0 (signed)Object[i].Group[j].QuadVer.size()){ glVertexPointer(3,GL_FLOAT,sizeof(float)*3, Object[i].Group[j].QuadVer[0]); glMultiDrawArrays(GL_LINE_LOOP, Object[i].Group[j].QuadWireID[0], Object[i].Group[j].QuadPoly[0],Object[i].Group[j].QuadVer.size()/4); } }} } glDisableClientState(GL_VERTEX_ARRAY); } //モデル描画 void MODEL DRAW(){ glEnableClientState(GL_VERTEX_ARRAY); for(int i=0;i (signed)Object.size();i++){ if(Object[i].View){ for(int j=0;j (signed)Object[i].Group.size();j++){ GLfloat material[] = { Material[j].Color.r, Material[j].Color.g, Material[j].Color.b, Material[j].Color.a }; glMaterialfv(GL_FRONT, GL_DIFFUSE, material); if(Object[i].Group[j].Texture_Use){ glEnable(GL_TEXTURE_2D); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindTexture(GL_TEXTURE_2D, texture[j]); }else{ glDisable(GL_TEXTURE_2D); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } if(0 Object[i].Group[j].TriUV.size())glTexCoordPointer(2,GL_FLOAT,0, Object[i].Group[j].TriUV[0]); if(0 Object[i].Group[j].TriVer.size()){ glVertexPointer(3,GL_FLOAT,0, Object[i].Group[j].TriVer[0]); glDrawArrays(GL_TRIANGLES,0,Object[i].Group[j].TriVer.size()); } if(0 Object[i].Group[j].QuadUV.size())glTexCoordPointer(2,GL_FLOAT,0, Object[i].Group[j].QuadUV[0]); if(0 (signed)Object[i].Group[j].QuadVer.size()){ glVertexPointer(3,GL_FLOAT,0, Object[i].Group[j].QuadVer[0]); glDrawArrays(GL_QUADS,0,Object[i].Group[j].QuadVer.size()); } }} } glDisable(GL_TEXTURE_2D); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } //マテリアルセット void MODEL Material_Set(){ int mat; fscanf_s(fp, %d , mat);//マテリアル数 fscanf_s(fp, %s , buf,255);// { を読み飛ばす for(int i=0;i mat;i++){ Material.push_back(mtl); fscanf_s(fp, %s , buf,255);//マテリアル名格納 str=buf; Material[Material.size()-1].MaterialName=Split( str, \ , \ );// を除去 fgets(buf,255,fp); char* buf2; if((buf2 = strstr(buf, col( )) != NULL ){//マテリアルカラー格納 sscanf_s(buf2, col(%f %f %f %f) , Material[Material.size()-1].Color.r, Material[Material.size()-1].Color.g, Material[Material.size()-1].Color.b, Material[Material.size()-1].Color.a); } if((buf2 = strstr(buf, dif( )) != NULL ){//ディフューズ格納 sscanf_s(buf2, dif(%f) , Material[Material.size()-1].ReflectionColor.diffuse); } if((buf2 = strstr(buf, amb( )) != NULL ){//アンビエント格納 sscanf_s(buf2, amb(%f) , Material[Material.size()-1].ReflectionColor.ambient); } if((buf2 = strstr(buf, emi( )) != NULL ){//エミッション格納 sscanf_s(buf2, emi(%f) , Material[Material.size()-1].ReflectionColor.emission); } if((buf2 = strstr(buf, spc( )) != NULL ){//スペキュラー格納 sscanf_s(buf2, spc(%f) , Material[Material.size()-1].ReflectionColor.specular); } if((buf2 = strstr(buf, power( )) != NULL ){//shiness格納 sscanf_s(buf2, power(%f) , Material[Material.size()-1].Power); } if((buf2 = strstr(buf, tex( )) != NULL ){//テクスチャ名格納 sscanf_s(buf2, tex(%[^)]) ,buf,255); str=buf; Material[Material.size()-1].TextureName=Split( str, \ , \ );// を除去 tex.push_back(tex2); tex[Material.size()-1] = new TEXTURE(Material[Material.size()-1].TextureName.c_str()); texture.push_back(texture2); glGenTextures(1, (GLuint *) texture[Material.size()-1]); glBindTexture(GL_TEXTURE_2D, texture[Material.size()-1]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glEnable(GL_TEXTURE_2D); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,tex[Material.size()-1]- Width, tex[Material.size()-1]- Height, 0,GL_RGBA, GL_UNSIGNED_BYTE, tex[Material.size()-1]- image); glDisable(GL_TEXTURE_2D); } } } //頂点情報セット void MODEL Vertex_Set(){ int Vertex_Max; Vector3f v; fscanf_s(fp, %d , Vertex_Max);//頂点数取得 fscanf_s(fp, %s , buf,255);// { を読み飛ばす for(int i=0;i Vertex_Max;i++){ fscanf_s(fp, %f %f %f , v.x, v.y, v.z); Vertex.push_back(v); } fscanf_s(fp, %s , buf,255);// } を読み飛ばす fscanf_s(fp, %s , buf,255); } //面情報セット void MODEL Face_Set(){ int Face_Max; int Face; Vector3f v; char* buf2; fscanf_s(fp, %d , Face_Max);//面数取得 fscanf_s(fp, %s , buf,255);// { を読み飛ばす for(int i=0;i Face_Max;i++){ fscanf_s(fp, %d , Face); if(Face==3){//3角形 Poly.Polygon=false; fgets(buf,255,fp); if((buf2 = strstr(buf, V( )) != NULL ){ sscanf_s(buf2, V(%d %d %d) , Poly.Index[0], Poly.Index[1], Poly.Index[2]); } if((buf2 = strstr(buf, M( )) != NULL ){ sscanf_s(buf2, M(%d) , Poly.MaterialID); } if((buf2 = strstr(buf, UV( )) != NULL ){ sscanf_s(buf2, UV(%f %f %f %f %f %f) , Poly.uv[0].u, Poly.uv[0].v, Poly.uv[1].u, Poly.uv[1].v, Poly.uv[2].u, Poly.uv[2].v); } for(int i=0;i 3;i++){ v=Vertex[Poly.Index[i]]; Object[Object.size()-1].Group[Poly.MaterialID].TriVer.push_back(v); Object[Object.size()-1].Group[Poly.MaterialID].TriUV.push_back(Poly.uv[i].u); Object[Object.size()-1].Group[Poly.MaterialID].TriUV.push_back(Poly.uv[i].v); } } if(Face==4){//4角形 Poly.Polygon=true; fgets(buf,255,fp); if((buf2 = strstr(buf, V( )) != NULL ){ sscanf_s(buf2, V(%d %d %d %d) , Poly.Index[0], Poly.Index[1], Poly.Index[2], Poly.Index[3]); } if((buf2 = strstr(buf, M( )) != NULL ){ sscanf_s(buf2, M(%d) , Poly.MaterialID); } if((buf2 = strstr(buf, UV( )) != NULL ){ sscanf_s(buf2, UV(%f %f %f %f %f %f %f %f) , Poly.uv[0].u, Poly.uv[0].v, Poly.uv[1].u, Poly.uv[1].v, Poly.uv[2].u, Poly.uv[2].v, Poly.uv[3].u, Poly.uv[3].v); } for(int i=0;i 4;i++){ v=Vertex[Poly.Index[i]]; Object[Object.size()-1].Group[Poly.MaterialID].QuadVer.push_back(v); Object[Object.size()-1].Group[Poly.MaterialID].QuadUV.push_back(Poly.uv[i].u); Object[Object.size()-1].Group[Poly.MaterialID].QuadUV.push_back(Poly.uv[i].v); } } } Vertex.clear(); fscanf_s(fp, %s , buf,255);// } を読み飛ばす fscanf_s(fp, %s , buf,255); } //メタセコイアファイル読み込み bool MODEL MQO_Load(char* FileName){ int visible; if(fopen_s( fp,FileName, r )!=0){return false;} while (!feof(fp)) { fscanf_s(fp, %s , buf,255); if (!strcmp(buf, Material )){Material_Set();} if (!strcmp(buf, Object )){ Object.push_back(obj); for(int i=0;i (signed)Material.size();i++){ Object[Object.size()-1].Group.push_back(gro); if(Material[i].TextureName.length()==0){ Object[Object.size()-1].Group[i].Texture_Use=false; }else{ Object[Object.size()-1].Group[i].Texture_Use=true; } } fscanf_s(fp, %s , buf,255); Object[Object.size()-1].Name=buf; while (!feof(fp)) { fscanf_s(fp, %s , buf,255); if (!strcmp(buf, visible )){ fscanf_s(fp, %d , visible); if(visible==0){Object[Object.size()-1].View=false;}else{Object[Object.size()-1].View=true;} } if (!strcmp(buf, vertex )){Vertex_Set();} if (!strcmp(buf, face )){Face_Set();} if (!strcmp(buf, } ))break; } } } fclose(fp); WIRE_SET();//ワイヤーフレーム情報セット return true; } main.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #pragma comment(lib, glew32.lib ) #include gl/glew.h #include GL/freeglut/freeglut.h #include MQO_wire.h #define WIDTH 320 #define HEIGHT 240 float angle=0.0f; MODEL* model; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0,0,WIDTH,HEIGHT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glRotatef(angle,1.0f,0.0f,0.0f);//回転 glRotatef(angle,0.0f,1.0f,0.0f);//回転 model- WIRE_FRAME_DRAW(); glutSwapBuffers(); } void idle(void) { angle+=2.0f; Sleep(1); glutPostRedisplay(); } void Init(){ glewInit(); glClearColor(0.0, 0.0, 0.0, 1.0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); //glEnable(GL_LIGHT0); //glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); model = new MODEL( sample.mqo ); } int main(int argc, char *argv[]) { glutInitWindowPosition(100, 100); glutInitWindowSize(WIDTH, HEIGHT); glutInit( argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutCreateWindow( MQOローダ ); glutDisplayFunc(display); glutIdleFunc(idle); Init(); glutMainLoop(); return 0; }
https://w.atwiki.jp/custime/pages/89.html
説明書に書いてないこと すーるゲーには説明書に書いていない重要事項がたくさんあります。知っていれば役に立つことばかり。。。 頂点削除 平滑で頂点削除されないようにする アイテムなどを簡単に分解 形状カスタムしたらペイントできなくなった tamzoneなどでDLしたアイテムデータ(icp)を読み込む 便利なショートカット ダウンロードしたファイルをどこに入れればいいかわからない 顔(ヘッド)をペイントする場合の目の周りの仕様について メタセコイアで作った3Dモデルをビューアモードで何種類も読み込んで表示する方法 半透明のアイテムの面を反転して不透明度を変える 頂点削除 四角変形ツールで角を合わせると選択範囲内の頂点が消滅する。その後「平滑」を使うと削除された頂点に隣接した頂点も消滅する。 平滑で頂点削除されないようにする 削除した頂点に隣接する頂点を範囲選択>右ドラッグでロックすると、消えないようになる。 アイテムなどを簡単に分解 「範囲選択」が消滅した頂点には適用されないことを利用すると楽。頂点削除→「平滑」→「範囲選択」でロックした後に「やり直し」で元に戻すと頂点削除されていた部分だけがロックされていない状態になる。後は「四角変形」で移動させて繰り返パーツごとに繰り返し。 形状カスタムしたらペイントできなくなった 小さいものを大きく引き伸ばすと内部テクスチャとの関係でうまくペイント出来ないことがある。形状カスタム>ファイル>セーブでひとまず保存。形状カスタム>ファイル>初期化で形を元に戻すと塗れるようになる。塗り終えたら再び形状カスタム>ファイル>ロードでカスタム後の形状に戻す。 tamzoneなどでDLしたアイテムデータ(icp)を読み込む 着替え>服かすたむ>(任意のカテゴリ)>ロード ※データ管理>部分ロードではicpを読み込めない 便利なショートカット ※パッチ付属のショートカット一覧 共通 Del → UIの表示/非表示 Home → 一つ上層のメニューに戻る Ctrl+右ドラッグ → 拡大・縮小と縦移動 Ctrl+左ドラッグ → カメラ回転 Ctrl+ホイールドラッグ → 上下左右移動 拡大鏡ボタンの上で右ドラッグ → パース変更 PrintScreenまたはP → スクリンショット撮影 F10 → 一時停止 Esc → タイトルに戻る 形状カスタム&ペイント Shift+左ドラッグ → 縦横比を保持したまま拡大&縮小 ※四角変形で角をドラッグする ホイール上下 → 各種ツール適用範囲変更 ※ペイントモードでは不可 Ctrl+ホイール上下 → Z軸回転 スペース → 範囲選択解除 Ctrl+Z → 元に戻す Ctrl+Y → やり直し ※ダンス・H・アニメ編集 Tab → FKガイド表示/非表示 1 → 各キャラの表示/非表示切り替え Ctrl+Z → 元に戻す Ctrl+Y → やり直し Shift押しながら ☆をクリック → 範囲指定 Shift押しながら ☆ペースト(小階層ペースト) →左右反転 ☆を右クリックドラッグ → 移動 Ctrl+C Ctrl+V → ☆のコピペ ビューアモード Shift押しながらドラッグ → 高速移動 移動、回転ボタンの上で左クリック+右クリック → 移動、回転の編集情報を初期化 ダウンロードしたファイルをどこに入れればいいかわからない たむたむすーる起動→ドラッグ&ドロップで勝手に読み込んでくれる。 手動で弄りたいときは\TEATIME\らぶデスFINAL!\save以下のフォルダ *.alp(全身衣装セット)→【Allpack】 *.han *.anm *.,pos(Hアニメ、アクション、ポーズ)→【Anime 】 *.bbs(ボディ)→【BODY】 *.drm(ビューアデータ)→【Diorama】 *.fms*.fsp(ヘッド形状、ペイント)→【Face】 *.wbs(衣装セット)→【Wear】 *.icp(衣装個別)→【Import】 *.hrp *.hms(髪の毛)→【Hair】 *Morp.?ms *Paint.?ps(変形、ペイント一時セーブ)→ 【QuickSave】 顔(ヘッド)をペイントする場合の目の周りの仕様について 目の周りの部分は基本的に片側をペイントすると反対側の対称位置も塗られます(テクスチャの仕様) 例外的に別々にペイントできるヘッドタイプもあります。 具体的にはアナ・まきな(らぶギア以降)、心愛・咲姫(ネトワクネトラル以降)、エイル(らぶデスFinal!)、のどか・たむたむ・智里のヘッドが該当します メタセコイアで作った3Dモデルをビューアモードで何種類も読み込んで表示する方法 ①mqo読み込みで例えば頭アクセサリー→オリジナルヘッドアクセ01で読み込む ②ビューワーモードでアイテム表示でオリジナルヘッドアクセ01を追加して表示 ③またmqo読み込みで頭アクセサリー→オリジナルヘッドアクセ01で別のmqoを読み込む ④またビューワーモードでアイテム表示でオリジナルヘッドアクセ01を追加して表示 ②と④は同じスロットのままで別のものが表示されるのでこれを繰り返すとPCスペックの許す限り自作mqoを配置できる 頭アクセサリー、オリジナル銃、オリジナル剣で可能 半透明のアイテムの面を反転して不透明度を変える 半透明のアイテムは面を反転すると不透明度が変化します 画像はクールゴーグルとワンピースで左が元の状態、右が反転した状態 反転したクールゴーグルは目の部分の色が暗い(薄い)感じにワンピースはパンツが透けて見えています 反転は四角変形で範囲を指定して辺の位置を入れ替えるように動かすとすぐに出来ます 服は全体を反転すると揺れて荒ぶったりするので使いにくいかも